#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time     : 2021/12/16 11:01 上午
# @Author   : Colin
# @Email    : colin@colinspace.com
# @File     : cws_image.py
# @Software : PyCharm
#


import datetime
from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont

"""
Todo
2021-12-16 生成目标图片带时间显示 
2021-12-16 添加图片水印的位置，左上、右上、左下、右下、中心（把位置的判断单独提出出来作为一个函数，简化代码）
2021-12-16 修复因为图片过大导致 文字水印超小的问题
2021-12-16 解决中文水印乱码问题
"""


# http://zhan.vi586.com/view-46.html
# 色彩模式
def color_code_convert_rgb(code):
    """
    颜色code码转换成RGB（长度为3的元组）
    """
    if code.startswith('#'):
        if len(code) == 7:
            color_code = code[1:7]
        else:
            print("Error: #开头的长度必须是7")
    else:
        if len(code) == 6:
            color_code = code
        else:
            print("Error: 非#开头的长度必须是6")
    r = int('0x' + color_code[0], 16) * 16 + int('0x' + color_code[1], 16)
    g = int('0x' + color_code[2], 16) * 16 + int('0x' + color_code[3], 16)
    b = int('0x' + color_code[4], 16) * 16 + int('0x' + color_code[5], 16)
    return r, g, b


def color_rgb_convert_code(rgb):
    """
    颜色RGB码转换成code码（#号开头的长度为7的字符串，代表一个颜色值）
    """
    if isinstance(rgb, (list, tuple)):
        if len(rgb) == 3:
            r, g, b = rgb
            r1 = hex(int(r / 16))[-1]
            r2 = hex(int(r % 16))[-1]

            g1 = hex(int(g / 16))[-1]
            g2 = hex(int(g % 16))[-1]

            b1 = hex(int(b / 16))[-1]
            b2 = hex(int(b % 16))[-1]
            return '#' + r1 + r2 + g1 + g2 + b1 + b2
        else:
            print("Error: 元组或者数组长度必须是3")
    else:
        print("Error: 必须是元组或者数组类型")


def watermark_position(tuple_origin, tuple_watermark, flag, border=10):
    """
    返回水印的位置，提取出来单独作为一个独立函数，简化代码
    origin_img 原始图片大小，tuple
    water_img  水印大小 tuple
    flag 1、左下角 2、右下角 3、右上角 4、左上角 5、中心
    border 水印举例图片边的边距
    """
    position = (0, 0)
    if flag == 1:
        position = (tuple_origin[0] - tuple_watermark[0] - border, tuple_origin[1] - tuple_watermark[1] - border)
    elif flag == 2:
        position = (border, tuple_origin[1] - tuple_watermark[1] - border)
    elif flag == 3:
        position = (border, border)
    elif flag == 4:
        position = (tuple_origin[0] - tuple_watermark[0] - border, border)
    elif flag == 5:
        position = (int((tuple_origin[0] - tuple_watermark[0])/2), int((tuple_origin[1] - tuple_watermark[1])/2))
    else:
        position = (border, border)
    return position


def add_watermark(image, category=1, watermark="colinspace.com", flag=1, fill=(254, 190, 38)):
    """
    给图片添加水印，支持添加文字和图片
    category=1 表示添加文字水印， watermark 则为文字
    category=2 表示添加图片水印，watermark则为图片路径

    关于水印的位置(这里边距设置为10)：
    1、左下角： watermark_xy = (im.size[0] - watermark_size_x - 10, im.size[1] - watermark_size_y -10)
    2、右下角： watermark_xy = (10, im.size[1] - watermark_size_y -10)
    3、右上角： watermark_xy = (10, 10)
    4、左上角： watermark_xy = (im.size[0] - watermark_size_x - 10, 10)
    5、中心：	watermark_xy = ((im.size[0] - watermark_size_x)/2, (im.size[1] - watermark_size_y)/2)

    关于支持中文水印:

    fill: 文字水印颜色
    """

    if isinstance(fill, (tuple, list)):
        real_fill = fill
    elif isinstance(fill, str):
        real_fill = color_code_convert_rgb(fill)

    im = Image.open(image).convert('RGBA')

    # 长宽边距
    border = 0
    if im.size[0] > im.size[1]:
        border = int(im.size[1]/100*3)
    else:
        border = int(im.size[0]/100*3)
    print("border: ", border)

    # 设置字体
    font_path = "/Users/colinspace/Library/Fonts/LXGWWenKai-Regular.ttf"
    # 字体大小设置为上面定义的border，这样可以修复遇到超大图片时因为设定固定字体导致文字水印过小的问题
    font = ImageFont.truetype(font_path, border)

    # 定义生成的最怕名称
    ext = image.split('.')[-1]
    filename = image.split('/')[-1].split('.')[0]
    target_image = "temp/" + filename + "-wm-" + datetime.datetime.now().strftime("%Y%m%d%H%M%S") + ".png"
    print(target_image)

    if category == 1:
        if isinstance(watermark, str):
            im_wm = Image.new('RGBA', im.size, (255, 255, 255, 0))
            # 在指定对象上可以绘图的对象 Draw instance
            img_draw = ImageDraw.Draw(im_wm)
            # 这里的 img_draw.textsize() 和后面的 img_draw.text() 一定要设置字体，不然针对中文会出现乱码报错
            text_position = watermark_position(im.size, img_draw.textsize(watermark, font=font), flag, border=border)
            # print("原始大小: ", im.size)
            # print("水印大小: ", img_draw.textsize(watermark))
            # print("水印位置: ", text_position)
            img_draw.text(text_position, watermark, fill=real_fill, font=font)
            out = Image.alpha_composite(im, im_wm)
            out.save(target_image)
        else:
            print("watermark must be a string!")

    elif category == 2:
        if ext in ['jpg', 'JPG', 'jpeg', 'JPEG', 'PNG', 'png']:
            # 判断是否是图片
            im_wm = Image.open(watermark)
            layer = Image.new('RGBA', im.size, (0, 0, 0, 0))
            image_position = watermark_position(im.size, im_wm.size, flag, border=border)
            layer.paste(im_wm, image_position)
            out = Image.composite(layer, im, layer)
            out.save(target_image)
        else:
            print("不支持的图片格式")